`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/07/05 17:55:15
// Design Name: 
// Module Name: mem_inst
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module mem_inst(
    clk,reset_n,addr,opcode,funct7,funct3,rs1,rs2,rd,imm_inst1,imm_inst2,imm_inst3,imm_inst4
    );
    input [31:0] addr;
    input clk;
    input reset_n;
    // output reg [31:0] inst;
    output [6:0] opcode;
    output [2:0] funct3;
    output [6:0] funct7;
    output [4:0] rd;
    output [4:0] rs1;
    output [4:0] rs2;
    output [11:0] imm_inst1;
    output [6:0] imm_inst2;
    output [4:0] imm_inst3;
    output [19:0] imm_inst4;

    reg [7:0] mem_inst [31:0];
    reg [31:0] inst;

    // always @(posedge clk) begin
    //     inst <= mem_inst[addr];
    // end

    always @(posedge clk,negedge reset_n) begin
        if(~reset_n) begin
            // {mem_inst[0],mem_inst[1],mem_inst[2],mem_inst[3]} <= 32'b0000000_00000_00001_000_00010_0110011; //R-type
            // {mem_inst[4],mem_inst[5],mem_inst[6],mem_inst[7]} <= 32'b000000001000_00010_000_00011_0010011; //I-type
            // {mem_inst[8],mem_inst[9],mem_inst[10],mem_inst[11]} <= 32'b0_000000_00000_00000_000_0100_0_1100011; //B-type
            // // {mem_inst[8],mem_inst[9],mem_inst[10],mem_inst[11]} <= 32'b0_0000000100_0_00000000_01000_1101111; //J-type
            // {mem_inst[12],mem_inst[13],mem_inst[14],mem_inst[15]} <= 32'b0100000_00100_00100_000_00101_0110011; //R-type
            // {mem_inst[16],mem_inst[17],mem_inst[18],mem_inst[19]} <= 32'b0000000_00011_00000_000_00000_0100011; //S-type
            // {mem_inst[20],mem_inst[21],mem_inst[22],mem_inst[23]} <= 32'b000000000000_00000_000_00110_0000011; //I-type
            // {mem_inst[24],mem_inst[25],mem_inst[26],mem_inst[27]} <= 32'b0000000_00000_00110_000_00111_0110011;//R-type
            // {mem_inst[28],mem_inst[29],mem_inst[30],mem_inst[31]} <= 32'b1_1111110010_1_11111111_00100_1101111; //J-type
        end
        else
            inst <= {mem_inst[addr],mem_inst[addr+1],mem_inst[addr+2],mem_inst[addr+3]};
    end

    assign opcode = inst[6:0];
    assign rd = inst[11:7];
    assign funct3 = inst[14:12];
    assign rs1 = inst[19:15];
    assign rs2 = inst[24:20];
    assign funct7 = inst[31:25];
    assign imm_inst1 = inst[31:20];
    assign imm_inst2 = inst[31:25];
    assign imm_inst3 = inst[11:7];
    assign imm_inst4 = inst[31:12];

endmodule
